package com.zac.coroutine.algorithm.leetcode.array

import android.util.Log

/**
 * author zac
 * date 2025/8/6
 *
 * 代码
 *
 *
 * 303. 区域和检索 - 数组不可变
 * 简单
 * 相关标签
 * premium lock icon
 * 相关企业
 * 给定一个整数数组  nums，处理以下类型的多个查询:
 *
 * 计算索引 left 和 right （包含 left 和 right）之间的 nums 元素的 和 ，其中 left <= right
 * 实现 NumArray 类：
 *
 * NumArray(int[] nums) 使用数组 nums 初始化对象
 * int sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ，包含 left 和 right 两点（也就是 nums[left] + nums[left + 1] + ... + nums[right] )
 *
 */
class NumArray {

    var sums: IntArray

    constructor(nums: IntArray) {
        sums = IntArray(nums.size)
        var i = 0
        nums.forEach { it ->
            if (i != 0) sums[i] = sums[i - 1] + it
            else sums[i] = it
            i++
        }
    }

    /**
     * 这题的题目描述有点问题
     *
     *
     * 简单来说
     * 在一个类中,给定一个整形数组,
     * 求其任意的子数组每个元素之和
     * 这个子数组之和的计算方法可能会高频多次调用
     * 所以要尽最大可能降低同一个数组时的时间复杂度
     *
     *
     * 解法:前缀和
     * 前缀和就是另起一个新数组,记录每个下标与其之前的所有元素之和
     * 这样就可以很方便的计算出某一个子数组之和
     *
     */
    fun sumRange(left: Int, right: Int): Int {
        return sums[right + 1] - sums[left]
    }

}

object Test {

    @JvmStatic
    fun main(args: Array<String>) {
        val numArray = NumArray(intArrayOf(-2, 0, 3 - 5, 2, -1))

        print(numArray.sumRange(0, 2))

    }
}
